%     AERO LOAD - программа для нагружения агрегатов самолета распределенной нагрузкой
%     Copyright (C) 2018-2024  Михаил Козлов
%     Сайт проекта: <http://www.fastenerdoctor.ru/>
%     Адрес электронной почты для связи с разработчиком:
%     <doctor.fastener@gmail.com>
% 
%     Эта программа является свободным программным обеспечением: Вы можете
%     распространять ее и/или изменять, соблюдая условия Универсальной общественной
%     лицензии GNU, опубликованной Фондом свободного программного обеспечения,
%     либо редакции 3, либо (на Ваше усмотрение) любой редакции, выпущенной позже.
% 
%     Эта программа распространяется в надежде на то, что она окажется полезной,
%     но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, включая даже подразумеваемую гарантию ТОВАРНОЙ ПРИГОДНОСТИ,
%     либо ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Ознакомьтесь с Универсальной общественной
%     лицензией GNU для получения более подробной информации.
% 
%     Вы должны были получить копию Универсальной общественной лицензии GNU
%     вместе с этой программой. Если Вы ее не получили, то перейдите по адресу:
%     <http://www.gnu.org/licenses/>.
% 
%     This program is free software: you can redistribute it and/or modify
%     it under the terms of the GNU General Public License as published by
%     the Free Software Foundation, either version 3 of the License, or
%     (at your option) any later version.
% 
%     This program is distributed in the hope that it will be useful,
%     but WITHOUT ANY WARRANTY; without even the implied warranty of
%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%     GNU General Public License for more details.
% 
%     You should have received a copy of the GNU General Public License
%     along with this program.  If not, see <https://www.gnu.org/licenses/>.

function ksi = Get_Param_Coord(A1, A2, A3, A4, X)

global Global_equivalence_tolerance;

% Порядок переменных при вызове функции:

% ksi = Get_Param_Coord(A1, A2, A3, A4, X)
% etta = Get_Param_Coord(A1, A3, A2, A4, X)

m = A2 + A3 - A1 - A4;
n = A1 - A3;
p = A2 - A1;
q = A1 - X;

u2 = p(2)*m(3) - m(2)*p(3);
u1 = p(2)*n(3) + q(2)*m(3) - m(2)*q(3) - n(2)*p(3);
u0 = q(2)*n(3) - n(2)*q(3);

v2 = - p(1)*m(3) + m(1)*p(3);
v1 = - p(1)*n(3) - q(1)*m(3) + m(1)*q(3) + n(1)*p(3);
v0 = - q(1)*n(3) + n(1)*q(3);

w2 = p(1)*m(2) - m(1)*p(2);
w1 = p(1)*n(2) + q(1)*m(2) - m(1)*q(2) - n(1)*p(2);
w0 = q(1)*n(2) - n(1)*q(2);

z4 = (u2*u2 + v2*v2 + w2*w2);
z3 = 2*(u1*u2 + v1*v2 + w1*w2);
z2 = u1*u1 + v1*v1 + w1*w1 + 2*u2*u0 + 2*v2*v0 + 2*w2*w0;
z1 = 2*(u1*u0 + v1*v0 + w1*w0);
z0 = u0*u0 + v0*v0 + w0*w0;

y2 = m(1)*m(1) + m(2)*m(2) + m(3)*m(3);
y1 = 2*(m(1)*n(1) + m(2)*n(2) + m(3)*n(3));
y0 = n(1)*n(1) + n(2)*n(2) + n(3)*n(3);

pol(1) = 2*z4*y2;
pol(2) = 3*z4*y1 + z3*y2;
pol(3) = 4*z4*y0 + 2*z3*y1;
pol(4) = 3*z3*y0 + z2*y1 - z1*y2;
pol(5) = 2*z2*y0 - 2*z0*y2;
pol(6) = z1*y0 - z0*y1;

all_roots = roots(pol);

Distances = nan(numel(all_roots),1);

for i=1:size(all_roots,1)
    if (isreal(all_roots(i)))
        Point_1 = Get_Cartesian_Coord(A1, A2, A3, A4, all_roots(i), 0);
        Point_2 = Get_Cartesian_Coord(A1, A2, A3, A4, all_roots(i), 1);
        Distances(i) = Get_Point_Line_Distance(X, Point_1, Point_2);
    end
end

max_root_distance = 0;

for i=1:size(all_roots,1)
    if (isreal(all_roots(i)))
        if (abs(all_roots(i) - 0.5) > max_root_distance)
            max_root_distance = abs(all_roots(i) - 0.5);
        end
    end
end

min_root_distance = max_root_distance + 1;

current_index = 0;

for i=1:size(all_roots,1)
    if (isreal(all_roots(i)))
        if (Distances(i) < Global_equivalence_tolerance)
            if (abs(all_roots(i) - 0.5) < min_root_distance)
                min_root_distance = abs(all_roots(i) - 0.5);
                current_index = i;
            end
        end
    end
end

ksi = all_roots(current_index);
